package org.eclipse.moquette.parser.netty;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import org.eclipse.moquette.proto.messages.AbstractMessage;
import org.eclipse.moquette.proto.messages.ConnAckMessage;

/**
 *
 * connAck 编码
 *
 * 会话表示标志（Session Present Flag）
 * 如果一个终端与服务器之间建立一个持久会话连接(假设这个终端没有使用到一个“clean session”标记清除已有回话标志),
 * 一个新增的“Session Present”标志（会话表示标志，逻辑值为true或false）会在CONNACK中出现，
 * 表明MQTT服务器已经拥有当前客户端上次连接会话信息，比如订阅的主题，排队信息和其它信息等。
 * 会话表示标志若为true，客户端可减少了一次发送订阅SUBSCRIBLE交互步骤，
 * 有助于更有效的数据通信；为false，客户端需要再次发送订阅SUBSCRIBLE消息，不可略过。
 *
 * Created by alex on 15-5-25.
 */
public class ConnAckEncoder extends DemuxEncoder<ConnAckMessage> {

    @Override
    protected void encode(ChannelHandlerContext ctx, ConnAckMessage message, ByteBuf out) {

        out.writeByte(AbstractMessage.CONNACK << 4);//messageType 左移 4位
        out.writeBytes(Utils.encodeRemainingLength(2));//connAck 2byte
        out.writeByte(message.isSessionPresent() ? 0x01 : 0x00);  //本来第一个字节是保留的 现在被session present使用
        out.writeByte(message.getReturnCode()); //return code 0 是连接成功
    }
}
